home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / scsh / re1.c < prev    next >
C/C++ Source or Header  |  1995-10-27  |  2KB  |  80 lines

  1. /* Scheme48 interface to Henry Spencer's regular expression package.
  2. ** Copyright (c) 1993, 1994 by Olin Shivers.
  3. */
  4.  
  5. #include <stdlib.h>
  6. #include "regexp.h"
  7. #include "cstuff.h"
  8.  
  9. /* Make sure our exports match up w/the implementation: */
  10. #include "re1.h"
  11.  
  12. #ifndef NULL
  13. #define NULL 0
  14. #endif
  15.  
  16. /* Not multi-threaded reentrant. */
  17. static char *regexp_error;
  18.  
  19. /* Stash error msg in global. */
  20. void regerror(char *msg) {regexp_error = msg;}
  21.  
  22. /* Return NULL normally, error string on error.
  23. ** Stash match info in start_vec and end_vec.
  24. ** Returns boolean match/no-match in hit.
  25. */
  26.  
  27. char *reg_match(const char *re, const char *string, int start,
  28.         scheme_value start_vec, scheme_value end_vec,  int *hit)
  29. {
  30.     regexp *prog;
  31.  
  32.     regexp_error = 0;
  33.     *hit = 0;
  34.     prog = regcomp(re);
  35.     if( !prog ) return regexp_error;
  36.  
  37.     if( VECTOR_LENGTH(start_vec) != NSUBEXP ) {
  38.     Free(prog);
  39.     return "Illegal start vector";
  40.     }
  41.     
  42.     if( VECTOR_LENGTH(end_vec) != NSUBEXP ) {
  43.     Free(prog);
  44.     return "Illegal end vector";
  45.     }
  46.  
  47.     if( regexec(prog, string+start) ) {
  48.     int i;
  49.     for(i=0; i<NSUBEXP; i++) {
  50.         VECTOR_REF(start_vec,i) = ENTER_FIXNUM(prog->startp[i] - string);
  51.         VECTOR_REF(end_vec,i)   = ENTER_FIXNUM(prog->endp[i]   - string);
  52.         }
  53.     *hit = 1;
  54.     }
  55.     
  56.     Free(prog);
  57.     return regexp_error;
  58.     }
  59.  
  60.  
  61. char *filter_stringvec(const char *re, char const **stringvec,  int *nummatch)
  62. {
  63.     regexp *prog;
  64.     regexp_error = 0;
  65.  
  66.     if( prog=regcomp(re) ) {
  67.     char const **p = stringvec;
  68.     char const **q = p;
  69.  
  70.     while(*p) {
  71.         if( regexec(prog, *p) ) *q++ = *p;
  72.         p++;
  73.         }
  74.     Free(prog);
  75.     *nummatch = q-stringvec;
  76.     }
  77.  
  78.     return regexp_error;
  79.     }
  80.